package demo.kk;

public class Singleton {
    private static Singleton instance; // 错误示例：没有volatile关键字

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) { // 第一次检查
            synchronized (Singleton.class) {
                if (instance == null) { // 第二次检查
                    // 非原子操作，可能发生指令重排
                    instance = new Singleton();
                    // 正常顺序：1. 分配内存 2. 初始化对象 3. 将引用指向内存地址
                    // 重排后可能：1. 分配内存 2. 将引用指向内存地址 3. 初始化对象
                    // 如果执行到2后，另一个线程在第一次检查时发现instance不为null，
                    // 就会直接返回一个尚未初始化完成的错误对象！
                }
            }
        }
        return instance;
    }
}